第2章 コンテナ技術とDockerの概要
Dockerの機能
Dockerのイメージを作る機能(Bulid)
Dockerイメージはアプリケーションの実行に必要なファイル群が格納されたディレクトリでtarファイルに出力できる。
Dockerイメージを共有する機能(Ship)
DockerイメージはDockerレジストリで共有できる。
Dockerコンテナを動かす機能(Run)
DockerはLinux上でコンテナ単位でサーバ機能を動かす。
Dockerは1つのLinuzカーネルを複数のコンテナで共有しており、コンテナ内で動作するプロセスを1つのグループとして管理し、グループごとにそれぞれファイルシステムやホスト名・ネットワークなどを割り当てている。
プロダクション環境では全てのDockerコンテナ1台のホストマシンで動かすことは稀で、システムのトラフィックの増減や可用性要件、信頼性要件などを考慮した上で複数のホストマシンからなる分散環境を構築する。
Dockerのコンポーネント
Docker Engine
Dockerイメージの生成やコンテナの起動などを行うためのDockerのコア機能。
Dockerコマンドの実行やDockerfileによるイメージ生成も行う。
Docker Registry
Dockerイメージを公開・共有するためのレジストリ機能。
Docker Compose
複数のコンテナの構成情報をコードで定義してコマンドを実行することでアプリケーションの実行環境を構成するコンテナ群を一元管理するツール。
Docker Machine
ローカルホスト用のVirtualBoxをはじめ、AWS EC2やAzureなどのクラウド環境などにDockerの実行環境をコマンドで自動生成するためのツール。
Docker Swarm
複数のDockerホストをクラスタかするためのツール。
クラスタの管理やAPIの提供を行うのがManagerでDockerコンテナを実行する役割がNodeとなる。
Dockerが動く仕組み
コンテナを区画化する仕組み(namespace)
PID naemspace
PIDとプロセスを隔離し、namespaceの異なるプロセス同士は互いにアクセスすることができない。
Network namespace
ネットワークデバイス、IPアドレス、ポート番号、ルーティングテーブル、フィルタリングテーブルなどのネットワークリソースを隔離されたnamespaceごとに独立して持つことができる。
ホストOS上で使用中のポートがあってもコンテナ内で同じポート番号を使うことができる。
UID namespace
UID、GIDをnamespaceごとに独立して持つことができる。
MOUNT namespace
マウント操作を行うとnamespace内に隔離されたファイルシステムツリーを作る。namespace内で行ったマウントはホストOSや他のnamespaceからはアクセスできないようになる。
UTS namespace
namespaceごとにホスト名やドメイン名を独自に持つことができる。
IPC namespace
プロセス間通信(IPC)オブジェクトをnamespaceごとに独立して持つことができる。
リソース管理の仕組み(cgroup)
リソース割り当てはLinuxカーネルのcontrol groupsの機能を使用している。
control groupsはプロセス・スレッドをグループ化してそのグループ内に存在するプロセス・スレッドに対して管理を行うための機能。
ネットワーク構成(仮想ブリッジ/仮想NIC)
LinuxにDockerをインストールすると、サーバの物理NICがdocker0という仮想ブリッジネットワークに接続される。このdocker0はDocker起動後にデフォルトで作成され、コンテナに172.17.0.0/16のサブネットマスクをもつプライベートIPアドレスがeth0に自動的に割り当てられる。
Dockerコンテナと外部ネットワークが通信を行うときは仮想ブリッジdocker0とホストOSの物理NICでパケットを転送する仕組みが必要で、NAPTの機能を使っている。 Dockerイメージのデータ権利の仕組み